1769
19288
Jaka jest najszybsza metoda konwersji java.nio.ByteBuffer a na (nowo utworzony) CharBuffer b lub char [] b.
Robiąc to, ważne jest, aby a [i] == b [i]. Oznacza to, że nie a [i] i a [i + 1] razem tworzą wartość b [j], co zrobiłoby getChar (i), ale wartości powinny być „rozłożone”.
byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // każdy bajt (które są podpisane)
char b [] = {1, 2, 3, 125, 126, 127, 128, 129, 130} // każdy znak (bez znaku)
Zauważ, że bajt: -128 ma takie same (8 dolnych) bitów jak znak: 128. Dlatego zakładam, że „najlepsza” interpretacja byłaby taka, jak wskazałem powyżej, ponieważ bity są takie same.
Potem potrzebuję również odwrotnego tłumaczenia: Najbardziej efektywny sposób na przywrócenie char [] lub java.nio.CharBuffer do java.nio.ByteBuffer. 
Więc to, co chcesz, to przekonwertować za pomocą kodowania ISO-8859-1.
Nie twierdzę nic o wydajności, ale przynajmniej napisać to dość krótko:
CharBuffer result = Charset.forName ("ISO-8859-1"). Decode (byteBuffer);
Innym kierunkiem byłoby:
ByteBuffer result = Zestaw znaków.forName ("ISO-8859-1"). Encode (charBuffer);
Proszę porównać to z innymi rozwiązaniami. (Aby być uczciwym, część Charset.forName nie powinna być dołączana, a także powinna być wykonana tylko raz, a nie dla każdego bufora ponownie).
Począwszy od Java 7 dostępna jest również klasa StandardCharsets z wstępnie utworzonymi instancjami Charset, więc możesz używać
CharBuffer result = StandardCharsets.ISO_8859_1.decode (byteBuffer);
i
ByteBuffer result = StandardCharsets.ISO_8859_1.encode (charBuffer);
zamiast. (Te wiersze działają tak samo jak poprzednie, tylko wyszukiwanie jest łatwiejsze i nie ma ryzyka błędnego wpisania nazw i nie ma potrzeby przechwytywania niemożliwych wyjątków).
|
Zgodziłbym się z @ Ishtar, sugerując, aby w ogóle unikać konwersji do nowej struktury i konwertować tylko wtedy, gdy tego potrzebujesz.
Jeśli jednak masz ByteBuffer sterty, możesz to zrobić.
ByteBuffer bb = ...
byte [] tablica = bb.array ();
char [] chars = new char [bb.remaining ()];
for (int i = 0; i